package tota.agent;

import java.util.*;

import emulator.peers.*;
import emulator.utils.GenPoint;
import emulator.agent.*;
import tota.middleware.*;

import tuplespace.tuples.*;
import tota.tuples.*;
import tota.tuples.hop.GradientTuple;

public class AgentTotaEXP extends AbstractAgent {
	static boolean REALTIME_SCREEN_UPDATE = true;

	PeerInterface_ApplicationSide peer;

	TotaMiddleware tota;

	public AgentTotaEXP(PeerInterface_ApplicationSide peer) {
		this.peer = peer;
		tota = new TotaMiddleware(peer);
		System.out.println(peer.getAddress() + " starting...");
	}

	public void inject(String tuple, String content) {
		TotaTuple t = (TotaTuple) createTuple(tuple);
		if (t == null)
			return;
		t.setContent(content);
		tota.inject(t);
	}

	public void remove(String tuple, String content) {
		TotaTuple t = (TotaTuple) createTuple(tuple);
		if (t == null)
			return;
		t.setContent(content);

		Vector v = tota.read(t);
		for (int i = 0; i < v.size(); i++) {
			Tuple delT = (Tuple) v.get(i);
			tota.delete(delT);
		}
	}

	private Tuple createTuple(String tuple) {
		Tuple t;
		try {
			Class clazz = Class.forName("tota.tuples." + tuple);
			t = (Tuple) clazz.newInstance();
		} catch (Exception e) {
			System.err.println("Cannot create the tuple!");
			e.printStackTrace();
			return null;
		}
		return t;
	}

	private void move(int x, int y) {
		Peer p = (Peer) peer.getRealIdentity();
		p.emu.move(p.toString(), new GenPoint(x, y));
	}
	
	
	private void printTuples(int time) {}
	
	private void printTuples2(int time) {
	 System.out.println("*** "+time+": "+peer.getAddress());
     Tuple t = createTuple("hop.GradientTuple");
	 t.setContent("<content=ciao>");
	 // read own tuple space
	 Vector v = tota.read(t);
	 for(int i=0; i<v.size();i++) 
	  System.out.println("own "+((GradientTuple)v.get(i)).hop);
	 // read neighbor tuple space
	 Vector vn = tota.readOneHop(t);
	 for(int i=0; i<vn.size();i++) 
	  System.out.println("neigh "+((GradientTuple)vn.get(i)).hop);
	}

	
	int time;
	public void step(int time) {
		this.time = time;
		tota.step(time);
		inject(10,"P0");
		print(90);
        move(100,"P0",275,110);
        print(290);
        move(300,"P0",475,100);
        move(500,"P0",525,100);
        print(690);
        move(700,"P0",100,100);
        print(890);
        move(900,"P0",300,300);
        print(1090);			
	}
	
	
	
	
	private void inject(int triggerTime, String triggerPeer) {
	 if(time == triggerTime && peer.equals(triggerPeer))
	  inject("hop.GradientTuple", "<content=ciao>");
	}
	
	private void move(int triggerTime, String triggerPeer, int x, int y) {
	 if(time == triggerTime && peer.equals(triggerPeer))
	  move(x,y);
	}
	
	private void print(int triggerTime){
	 if(time == triggerTime)
      printTuples(time); 
	}
	
	
	/***************************************************************************/
	/*		LOW LEVEL USELESS METHODS 										   */
	/***************************************************************************/
	
	public synchronized void showAgentFrame() {
	}

	public synchronized void hideAgentFrame() {
		peer.shutDown();
	}

	public synchronized Object getRealIdentity() {
		return this;
	}
}